路径规划 室外模拟导航
最后更新时间:2019年7月5日
功能描述
完整意义上的地图导航,包括两部分,一是路线规划,二是路径引导(导航)。只有规划出路线之后,才能进行路径引导。
路径规划,即通过起点、途经点、终点以及偏好设置,基于导航数据分析计算,规划出想要的最佳路径。MapGIS Mobile 10.3 for iOS SDK导航模块提供的功能接口,支持针对不同的路线规划需求,如距离最短、时间最快、费用最低等多偏好设置;多个途经点和避让区的设置;跨楼层的室内路径计算,以及室内外一体化的路径计算。不同需求采用不同接口,来满足实际应用中的各种需求。
实现方法
路径规划功能实现的一般流程如下图所示:
1
MGSRouteAnalysis *routeAnalysis=[[MGSRouteAnalysis alloc] init];
2
通过室内外导航数据路径,初始化路径分析对象。
//室外导航数据路径 NSString* outDoorPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Navigation/outdoor/WuhanNavi.db"]; //室内导航数据文件夹路径 NSString* inDoorPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Navigation/indoor"]; //初始化路径分析对象,为路径规划对象设置导航数据路径(参数1:室外导航数据文件路径;参数2:室内导航数据目录) [routeAnalysis initWithDBPath:outDoorPath indoorNaviDBsPath:inDoorPath];
3
确定导航的出发地、途经点、目的地,可通过GPS定位功能获取设备当前定位点作为起点,也可通过POI搜索获取,或者通过用户手势交互选点获取;起点、途经点、终点可用图像MGSGraphicImage方式绘制显示在地图上。
//确定路径规划的起点、终点,需要的话可以设置中间点。 MGSDot startDot=MGSDotMake(12735780.301316,3563458.653495); //起点 MGSDot wayDot1=MGSDotMake(12725802,3571690); //途经点,可有多个 MGSDot endDot=MGSDotMake(12725802,3571690); //终点 //创建路径点 MGSWayPoint *startWayPoint=[[MGSWayPoint alloc] initWithDot:startDot]; MGSWayPoint *middleWayPoint1=[[MGSWayPoint alloc] initWithDot:wayDot1]; MGSWayPoint *endWayPoint=[[MGSWayPoint alloc] initWithDot:endDot]; //创建路径点数组对象 NSMutableArray *wayPointArray=[[NSMutableArray alloc] init]; [wayPointArray addObject:startWayPoint]; [wayPointArray addObject:middleWayPoint1]; [wayPointArray addObject:endWayPoint];
重要说明:在构造路径点MGSWayPoint对象时,室内、室外路径点的构造方式不一样:
MGSWayPoint *wayPoint=[[MGSWayPoint alloc] initWithDot:wayDot];
//构造MGSWayPoint路径点对象,楼层为9层,楼栋为598号 MGSWayPoint *wayPoint=[[MGSWayPoint alloc] initWithInfo:wayDot floorID:8 buildingID:598]; //-1为负一层,0为第一层,1为第二层,以此类推
4
在准备工作完成后,使用室内外一体化路径规划接口calculationRoute计算路径。如下:设置目标行进的方向、室外算路模式为距离最短、室内算路模式室内优先电梯、不设置规避区、不设置车牌号。
//计算路径,返回MGSRoute数组 NSArray<MGSRoute*>* routeArray=[routeAnalysis calculationRoute:-1.0f wayPoints:wayPointArray naviMode:DrivingLeastDistance naviModeIndoor:WalkDefault avoidRegions:nil avoidRegionsCount:0 plateNO:nil];
calculationRoute接口具体说明如下,可通过各种参数的设置来实现特定的功能。
接口 | 说明 |
---|---|
- (NSArray<MGSRoute*>*)calculationRoute:(float)angle
wayPoints:(NSArray<MGSWayPoint*>*)wayPoints naviMode:(int)naviMode
naviModeIndoor:(int)naviModeIndoor avoidRegions:(MGSRect*)avoidRegions
avoidRegionsCount:(long)avoidRegionsCount plateNO:(NSString*)plateNO; 参数:定位目标行进的方向、路径点、室外道路算路模式、室内道路算路模式、规避区域、车牌号 |
路径计算 |
SDK提供了多种算路模式,可以根据个人偏好,设置不同参数来得到不同的导航路线:室外导航可以选择步行或者驾车;驾车的话可以选择距离最短、用时最少或者最省钱的路线;室内导航可以选择优先电梯或者优先楼梯的路线。如下表所示,各种算路模式对应MGSRouteMode中的字段常量。同时,算路模式的实现必须有相应的数据支持。
算路模式 | 算路模式参数 | |
---|---|---|
室外 | 驾车最短距离 | DrivingLeastDistance |
驾车时间最短 | DrivingLeastTime | |
驾车最省钱 | DrivingSaveMoney | |
步行 | WalkDefault | |
室内 | 室内优先电梯 | RouteModeIndoorPreferElevator |
室内优先自动扶梯 | RouteModeIndoorPreferEscalator | |
室内优先楼梯 | RouteModeIndoorPreferStairs |
5
路径规划成功后,得到路径,通过获取MGSRoute路线对象获取信息,如路线坐标点、路段描述、路段数目、路径外包矩形等。最重要的是路线的绘制,可通过纹理线绘制功能将路线的坐标点绘制成线展示在地图上。
//获取计算得到的第一条路径 MGSRoute *resultRoute=routeArray[0]; NSString *routeOverView=[route overview]; //获取路径概况 MGSDot *routeDots = [route coors]; //获取路径所有坐标点,用于路线的绘制显示 long routeDotsCount = [route dotsCount]; //获取路径坐标点个数 MGSRect routeRect=[route boundingRect]; //获取路径外包矩形,可用于将地图缩放到此范围 long routeLength=[route length]; //获取路径长度 MGSDot routeSDot=[route startPos]; //获取路径起点坐标 MGSDot routeEDot=[route targetPos]; //获取路径终点坐标 int routeStepCount = [route stepCount]; //获取路径中路段数目 //路线绘制:绘制纹理线 MGSGraphicPolylin *routeGraphicPolylin=[[MGSGraphicPolylin alloc] init]; //创建线图形对象 [routeGraphicPolylin setFillTextureImage:[UIImage imageNamed:@"ico_texture_line.png"]]; //设置填充纹理 [routeGraphicPolylin setLineWidth:8]; //设置线宽 [routeGraphicPolylin setPoints:routeDots andCount:routeDotsCount]; //设置坐标点 [[_mapView graphicsOverlay] addGraphic:routeGraphicPolylin]; //绘制 [_mapView refresh]; //刷新
提示:导航数据为何种空间参考系,得到的路线坐标也是相同的坐标系,如果和显示地图的参考系不匹配,则需要转换。例如,如果导航数据为经纬度坐标,地图为Web墨卡托坐标系,获取路径坐标之后,需将其坐标点转换,才能正常显示在地图上。